// Javascript code
/**
 * author：小小游 --- allen
 * date：2018.02.03
 * lastUpdateDate：2018.02.03
 * description：传统Javascript面向对象写法
 */

/**
 * 1.在传统的JS面向对象不够语义话，ES6规范了这个标准
 * 2.在传统的JS面向对象里，我们知道类和构造器就是一个东西，这显然太扯蛋了
 * 3.闲话不多说，直接来个例子吧
 */
// 用户父类
function User (name, gender, age) {
    // 内部执行流程
    // var this = new Object();
    this.name = name;
    this.gender = gender;
    this.age = age;

    // 再把这个this返回出去
    // return this;
}

// 为父类添加静态方法
User.getStaticMethod = function () {
    return 'User';
};

// 为父类添加prototype方法
User.prototype.changeName = function (name) {
    this.name = name;
};

User.prototype.changeGender = function (gender) {
    this.gender = gender;
};

User.prototype.changeAge = function (age) {
    this.age = age;
};

// 为父类添加取值函数方法
Object.defineProperty(User.prototype, 'info', {
    get () {
        return 'name:' + this.name + ' | gender:' + this.gender + ' | age:' + this.age;
    }
});

var user = new User('allen', '男', 28);
console.log(user);

// 管理员子类继承用户父类
function Manager (name, gender, age, password) {
    User.call(this, name, gender, age);
    this.password = password;
}

// 继承父类的静态方法
Manager.__proto__ = User;

// 继承父类的原型方法
Manager.prototype = new User();
// Manager.prototype = User.prototype;

// 创建子类自己的原型方法
Manager.prototype.changePassword = function (password) {
    this.password = password;
};

var manager = new Manager('xiaoyou', '男', '22', '88888888');
console.log(manager);
manager.changeName('hhhhhhhh');
console.log(manager.name);
console.log(manager.info);
